{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 使用 tf.keras.datasets 加载数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import tensorflow as tf"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'2.2.0-rc4'"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tf.__version__"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "mnist = tf.keras.datasets.mnist\n",
    "\n",
    "(x_train, y_train), (x_test, y_test) = mnist.load_data()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(60000, 28, 28) (60000,)\n",
      "(10000, 28, 28) (10000,)\n"
     ]
    }
   ],
   "source": [
    "print(x_train.shape, y_train.shape)\n",
    "print(x_test.shape, y_test.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_train = y_train.astype('float32')\n",
    "y_test = y_test.astype('float32')\n",
    "\n",
    "# Reserve 10,000 samples for validation\n",
    "x_val = x_train[-10000:]\n",
    "y_val = y_train[-10000:]\n",
    "x_train = x_train[:-10000]\n",
    "y_train = y_train[:-10000]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(50000, 28, 28)\n",
      "(10000, 28, 28)\n"
     ]
    }
   ],
   "source": [
    "print(x_train.shape)\n",
    "print(x_val.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 15 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "fig = plt.figure()\n",
    "for i in range(15):\n",
    "    plt.subplot(3,5,i+1) # 绘制前15个手写体数字，以3行5列子图形式展示\n",
    "    plt.tight_layout() # 自动适配子图尺寸\n",
    "    plt.imshow(x_train[i], cmap='Greys') # 使用灰色显示像素灰度值\n",
    "    plt.title(\"Label: {}\".format(y_train[i])) # 设置标签为子图标题\n",
    "    plt.xticks([]) # 删除x轴标记\n",
    "    plt.yticks([]) # 删除y轴标记"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 使用 tf.keras 管理 Sequential 模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "model = tf.keras.models.Sequential([\n",
    "  tf.keras.layers.Flatten(input_shape=(28, 28)),\n",
    "  tf.keras.layers.Dense(128, activation='relu'),\n",
    "  tf.keras.layers.Dropout(0.2),\n",
    "  tf.keras.layers.Dense(10)\n",
    "])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"sequential\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "flatten (Flatten)            (None, 784)               0         \n",
      "_________________________________________________________________\n",
      "dense (Dense)                (None, 128)               100480    \n",
      "_________________________________________________________________\n",
      "dropout (Dropout)            (None, 128)               0         \n",
      "_________________________________________________________________\n",
      "dense_1 (Dense)              (None, 10)                1290      \n",
      "=================================================================\n",
      "Total params: 101,770\n",
      "Trainable params: 101,770\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Requirement already satisfied: graphviz in /usr/local/lib/python3.6/dist-packages (0.14)\n",
      "Requirement already satisfied: pydot in /usr/local/lib/python3.6/dist-packages (1.4.1)\n",
      "Requirement already satisfied: pyparsing>=2.1.4 in /usr/local/lib/python3.6/dist-packages (from pydot) (2.4.7)\n",
      "Reading package lists... Done\n",
      "Building dependency tree       \n",
      "Reading state information... Done\n",
      "graphviz is already the newest version (2.40.1-2).\n",
      "0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.\n"
     ]
    }
   ],
   "source": [
    "!pip install graphviz pydot\n",
    "!apt-get install -y graphviz"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Failed to import pydot. You must install pydot and graphviz for `pydotprint` to work.\n"
     ]
    }
   ],
   "source": [
    "tf.keras.utils.plot_model(model, 'mnist_model.png')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [],
   "source": [
    "model.compile(optimizer=\"adam\",\n",
    "              loss='sparse_categorical_crossentropy',\n",
    "              metrics=['accuracy'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/5\n",
      "1563/1563 [==============================] - 3s 2ms/step - loss: 0.3296 - accuracy: 0.9153\n",
      "Epoch 2/5\n",
      "1563/1563 [==============================] - 3s 2ms/step - loss: 0.3318 - accuracy: 0.9192\n",
      "Epoch 3/5\n",
      "1563/1563 [==============================] - 3s 2ms/step - loss: 0.3156 - accuracy: 0.9213\n",
      "Epoch 4/5\n",
      "1563/1563 [==============================] - 3s 2ms/step - loss: 0.3205 - accuracy: 0.9196\n",
      "Epoch 5/5\n",
      "1563/1563 [==============================] - 3s 2ms/step - loss: 0.3061 - accuracy: 0.9238\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<tensorflow.python.keras.callbacks.History at 0x7f0a3ce315f8>"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.fit(x_train, y_train, epochs=5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "313/313 [==============================] - 0s 1ms/step - loss: 0.3225 - accuracy: 0.9475\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[0.3224552869796753, 0.9474999904632568]"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.evaluate(x_val, y_val)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 保存为 SavedModel 格式模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/resource_variable_ops.py:1817: calling BaseResourceVariable.__init__ (from tensorflow.python.ops.resource_variable_ops) with constraint is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "If using Keras pass *_constraint arguments to layers.\n",
      "INFO:tensorflow:Assets written to: mnist_model/assets\n"
     ]
    }
   ],
   "source": [
    "model.save(\"mnist_model\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 加载 SavedModel 格式模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "sm = tf.keras.models.load_model(\"mnist_model\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "313/313 [==============================] - ETA: 0s - loss: 0.2629 - accuracy: 0.93 - 0s 1ms/step - loss: 0.2520 - accuracy: 0.9410\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[0.25202295184135437, 0.9409999847412109]"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sm.evaluate(x_val, y_val)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 保存为 HDF5 格式模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [],
   "source": [
    "model.save(\"mnist_model.h5\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 加载 HDF5 格式模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "hm = tf.keras.models.load_model(\"mnist_model.h5\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "313/313 [==============================] - 0s 1ms/step - loss: 0.2520 - accuracy: 0.9410\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[0.25202295184135437, 0.9409999847412109]"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "hm.evaluate(x_val, y_val)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 使用 tf.keras 管理 functional API"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "# For easy reset of notebook state.\n",
    "tf.keras.backend.clear_session() "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 使用 tf.keras.Input 定义模型输入"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "inputs = tf.keras.Input(shape=(28, 28))\n",
    "x = tf.keras.layers.Flatten(input_shape=(28, 28))(inputs)\n",
    "x = tf.keras.layers.Dense(128, activation='relu')(x)\n",
    "x = tf.keras.layers.Dropout(0.2)(x)\n",
    "outputs = tf.keras.layers.Dense(10)(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "model = tf.keras.Model(inputs=inputs, outputs=outputs, name='mnist_model')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"mnist_model\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "input_1 (InputLayer)         [(None, 28, 28)]          0         \n",
      "_________________________________________________________________\n",
      "flatten (Flatten)            (None, 784)               0         \n",
      "_________________________________________________________________\n",
      "dense (Dense)                (None, 128)               100480    \n",
      "_________________________________________________________________\n",
      "dropout (Dropout)            (None, 128)               0         \n",
      "_________________________________________________________________\n",
      "dense_1 (Dense)              (None, 10)                1290      \n",
      "=================================================================\n",
      "Total params: 101,770\n",
      "Trainable params: 101,770\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Requirement already satisfied: graphviz in /usr/local/lib/python3.6/dist-packages (0.14)\n",
      "Requirement already satisfied: pydot in /usr/local/lib/python3.6/dist-packages (1.4.1)\n",
      "Requirement already satisfied: pyparsing>=2.1.4 in /usr/local/lib/python3.6/dist-packages (from pydot) (2.4.7)\n",
      "Reading package lists... Done\n",
      "Building dependency tree       \n",
      "Reading state information... Done\n",
      "graphviz is already the newest version (2.40.1-2).\n",
      "0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.\n"
     ]
    }
   ],
   "source": [
    "!pip install graphviz pydot\n",
    "!apt-get install -y graphviz"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tf.keras.utils.plot_model(model, model.name+'.png')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [],
   "source": [
    "model.compile(optimizer=\"adam\",\n",
    "              loss='sparse_categorical_crossentropy',\n",
    "              metrics=['accuracy'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/5\n",
      "1563/1563 [==============================] - 2s 2ms/step - loss: 0.4323 - accuracy: 0.8971\n",
      "Epoch 2/5\n",
      "1563/1563 [==============================] - 2s 2ms/step - loss: 0.3921 - accuracy: 0.9016\n",
      "Epoch 3/5\n",
      "1563/1563 [==============================] - 2s 2ms/step - loss: 0.3731 - accuracy: 0.9060\n",
      "Epoch 4/5\n",
      "1563/1563 [==============================] - 2s 2ms/step - loss: 0.3530 - accuracy: 0.9123\n",
      "Epoch 5/5\n",
      "1563/1563 [==============================] - 2s 2ms/step - loss: 0.3406 - accuracy: 0.9134\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<tensorflow.python.keras.callbacks.History at 0x7f0a3c6599b0>"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.fit(x_train, y_train, epochs=5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "313/313 [==============================] - 0s 1ms/step - loss: 0.3225 - accuracy: 0.9475\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[0.3224552869796753, 0.9474999904632568]"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.evaluate(x_val, y_val)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 模型保存和加载：functional API 与 Sequential 完全兼容"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
